// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
const AccountsService = imports.gi.AccountsService;
+const Atk = imports.gi.Atk;
const Clutter = imports.gi.Clutter;
const Gdm = imports.gi.Gdm;
const Gio = imports.gi.Gio;
const Shell = imports.gi.Shell;
const St = imports.gi.St;
+const Layout = imports.ui.layout;
const Main = imports.ui.main;
-const ModalDialog = imports.ui.modalDialog;
const Panel = imports.ui.panel;
-const ShellEntry = imports.ui.shellEntry;
const Tweener = imports.ui.tweener;
const UserWidget = imports.ui.userWidget;
const UnlockDialog = new Lang.Class({
Name: 'UnlockDialog',
- Extends: ModalDialog.ModalDialog,
_init: function(parentActor) {
- this.parent({ shellReactive: true,
- styleClass: 'login-dialog',
- keybindingMode: Shell.KeyBindingMode.UNLOCK_SCREEN,
- parentActor: parentActor
- });
+ this.actor = new St.Widget({ accessible_role: Atk.Role.WINDOW,
+ style_class: 'login-dialog',
+ visible: false });
+
+ this.actor.add_constraint(new Layout.MonitorConstraint({ primary: true }));
+ parentActor.add_child(this.actor);
this._userManager = AccountsService.UserManager.get_default();
this._userName = GLib.get_user_name();
this._userVerifier.connect('show-login-hint', Lang.bind(this, this._showLoginHint));
this._userVerifier.connect('hide-login-hint', Lang.bind(this, this._hideLoginHint));
- this._userWidget = new UserWidget.UserWidget(this._user);
- this.contentLayout.add_actor(this._userWidget.actor);
-
- this._promptLayout = new St.BoxLayout({ style_class: 'login-dialog-prompt-layout',
- vertical: true });
-
- this._promptLabel = new St.Label({ style_class: 'login-dialog-prompt-label' });
- this._promptLayout.add(this._promptLabel,
- { x_align: St.Align.START });
-
- this._promptEntry = new St.Entry({ style_class: 'login-dialog-prompt-entry',
- can_focus: true });
- this._promptEntry.clutter_text.connect('activate', Lang.bind(this, this._doUnlock));
- this._promptEntry.clutter_text.set_password_char('\u25cf');
- ShellEntry.addContextMenu(this._promptEntry, { isPassword: true });
- this.setInitialKeyFocus(this._promptEntry);
- this._promptEntry.clutter_text.connect('text-changed', Lang.bind(this, function() {
- this._updateOkButtonSensitivity(this._promptEntry.text.length > 0);
- }));
-
- this._promptLayout.add(this._promptEntry,
- { expand: true,
- x_fill: true });
-
- this.contentLayout.add_actor(this._promptLayout);
+ this._promptBox = new St.BoxLayout({ vertical: true });
+ this.actor.add_child(this._promptBox);
+ this._promptBox.add_constraint(new Clutter.AlignConstraint({ source: this.actor,
+ align_axis: Clutter.AlignAxis.BOTH,
+ factor: 0.5 }));
- this._promptMessage = new St.Label({ visible: false });
- this.contentLayout.add(this._promptMessage, { x_fill: true });
+ this._authPrompt = new GdmUtil.AuthPrompt();
+ this._authPrompt.setUser(this._user);
+ this._authPrompt.setPasswordChar('\u25cf');
+ this._authPrompt.nextButton.label = _("Unlock");
+ this._authPrompt.connect('cancel', Lang.bind(this, this._escape));
+ this._authPrompt.connect('next', Lang.bind(this, this._doUnlock));
- this._promptLoginHint = new St.Label({ style_class: 'login-dialog-prompt-login-hint' });
- this._promptLoginHint.hide();
- this.contentLayout.add_actor(this._promptLoginHint);
+ this._promptBox.add_child(this._authPrompt.actor);
this.allowCancel = false;
- this.buttonLayout.visible = true;
- this.addButton({ label: _("Cancel"),
- action: Lang.bind(this, this._escape),
- key: Clutter.KEY_Escape },
- { expand: true,
- x_fill: false,
- y_fill: false,
- x_align: St.Align.START,
- y_align: St.Align.MIDDLE });
- this.placeSpinner({ expand: false,
- x_fill: false,
- y_fill: false,
- x_align: St.Align.END,
- y_align: St.Align.MIDDLE });
- this._okButton = this.addButton({ label: _("Unlock"),
- action: Lang.bind(this, this._doUnlock),
- default: true },
- { expand: false,
- x_fill: false,
- y_fill: false,
- x_align: St.Align.END,
- y_align: St.Align.MIDDLE });
let screenSaverSettings = new Gio.Settings({ schema: 'org.gnome.desktop.screensaver' });
if (screenSaverSettings.get_boolean('user-switch-enabled')) {
x_align: St.Align.START,
x_fill: true });
this._otherUserButton.connect('clicked', Lang.bind(this, this._otherUserClicked));
- this.dialogLayout.add(this._otherUserButton,
- { x_align: St.Align.START,
- x_fill: false });
+ this._promptBox.add_child(this._otherUserButton);
} else {
this._otherUserButton = null;
}
let batch = new Batch.Hold();
this._userVerifier.begin(this._userName, batch);
- Main.ctrlAltTabManager.addGroup(this.dialogLayout, _("Unlock Window"), 'dialog-password-symbolic');
+ Main.ctrlAltTabManager.addGroup(this.actor, _("Unlock Window"), 'dialog-password-symbolic');
this._idleMonitor = new GnomeDesktop.IdleMonitor();
this._idleWatchId = this._idleMonitor.add_idle_watch(IDLE_TIMEOUT * 1000, Lang.bind(this, this._escape));
},
_updateSensitivity: function(sensitive) {
- this._promptEntry.reactive = sensitive;
- this._promptEntry.clutter_text.editable = sensitive;
- this._updateOkButtonSensitivity(sensitive && this._promptEntry.text.length > 0);
+ this._authPrompt.updateSensitivity(sensitive);
+
if (this._otherUserButton) {
this._otherUserButton.reactive = sensitive;
this._otherUserButton.can_focus = sensitive;
}
},
- _updateOkButtonSensitivity: function(sensitive) {
- this._okButton.reactive = sensitive;
- this._okButton.can_focus = sensitive;
- },
-
_showMessage: function(userVerifier, message, styleClass) {
- if (message) {
- this._promptMessage.text = message;
- this._promptMessage.styleClass = styleClass;
- GdmUtil.fadeInActor(this._promptMessage);
- } else {
- GdmUtil.fadeOutActor(this._promptMessage);
- }
+ this._authPrompt.setMessage(message, styleClass);
},
_onAskQuestion: function(verifier, serviceName, question, passwordChar) {
return;
}
- this._promptLabel.text = question;
-
if (!this._firstQuestion)
this._promptEntry.text = '';
else
this._firstQuestion = false;
- this._promptEntry.clutter_text.set_password_char(passwordChar);
- this._promptEntry.menu.isPassword = passwordChar != '';
+ this._authPrompt.setPasswordChar(passwordChar);
+ this._authPrompt.setQuestion(question);
this._currentQuery = serviceName;
+
this._updateSensitivity(true);
- this.setWorking(false);
+ this._authPrompt.stopSpinning();
},
_showLoginHint: function(verifier, message) {
- this._promptLoginHint.set_text(message)
- GdmUtil.fadeInActor(this._promptLoginHint);
+ this._authPrompt.setHint(message);
},
_hideLoginHint: function() {
- GdmUtil.fadeOutActor(this._promptLoginHint);
+ this._authPrompt.setHint(null);
},
_doUnlock: function() {
// the actual reply to GDM will be sent as soon as asked
this._firstQuestionAnswer = this._promptEntry.text;
this._updateSensitivity(false);
- this.setWorking(true);
+ this._authPrompt.startSpinning();
return;
}
this._currentQuery = null;
this._updateSensitivity(false);
- this.setWorking(true);
+ this._authPrompt.startSpinning();
- this._userVerifier.answerQuery(query, this._promptEntry.text);
+ this._userVerifier.answerQuery(query, this._authPrompt.getAnswer());
},
_onVerificationComplete: function() {
this._firstQuestion = true;
this._userVerified = false;
- this._promptEntry.text = '';
- this._promptEntry.clutter_text.set_password_char('\u25cf');
- this._promptEntry.menu.isPassword = true;
+ this._authPrompt.clear();
this._updateSensitivity(false);
- this.setWorking(false);
+ this._authPrompt.stopSpinning();
},
_escape: function() {
destroy: function() {
this._userVerifier.clear();
+ this.actor.destroy();
if (this._idleWatchId) {
this._idleMonitor.remove_watch(this._idleWatchId);
this._idleWatchId = 0;
}
-
- this.parent();
},
cancel: function() {
},
addCharacter: function(unichar) {
- this._promptEntry.clutter_text.insert_unichar(unichar);
+ this._authPrompt.addCharacter(unichar);
},
finish: function(onComplete) {
this._userVerifier.disconnect(signalId);
onComplete();
}));
+ },
+
+ open: function(timestamp) {
+ this.actor.show();
+
+ if (this._isModal)
+ return true;
+ if (!Main.pushModal(this.actor, { timestamp: timestamp,
+ keybindingMode: Shell.KeyBindingMode.UNLOCK_SCREEN }))
+ return false;
+
+ this._isModal = true;
+
+ return true;
+ },
+
+ popModal: function(timestamp) {
+ if (this._isModal) {
+ Main.popModal(this.actor, timestamp);
+ this._isModal = false;
+ }
}
});
+Signals.addSignalMethods(UnlockDialog.prototype);